import {AxiosInstance, type AxiosRequestHeaders, CreateAxiosDefaults,} from "axios";

/** 请求配置 */
export interface CustomRequestConfig {
  /** 是否显示loading */
  showLoading?: boolean | (() => boolean);
  /** 显示loading的函数 */
  showLoadingFunction?: () => void;
  /** 隐藏loading的函数 */
  hideLoadingFunction?: (isSuccess: boolean) => void;

  /** 添加请求头前的钩子函数 */
  beforeHandleRequestHeaders?: (requestConfig: RequestConfig<any>) => void;
  /** 添加请求头的钩子函数 */
  handleRequestHeaders?: (headers: AxiosRequestHeaders) => void;
  /** 添加请求头后的钩子函数 */
  afterHandleRequestHeaders?: (requestConfig: RequestConfig<any>) => void;

  /** 请求是否成功。参数为服务器响应体 */
  serverResponseSuccess?: boolean | ((serverResponseBody: any) => boolean);
  /** 是否认证失败 */
  authenticationFailure?: boolean | ((serverResponseBody: any) => boolean);
  /** 处理认证失败的动作 */
  handleAuthenticationFailure?: () => void;
  /** 是否传递完整响应，true传递AxiosResponse，false传递AxiosResponse.data（即服务器响应体） */
  passCompleteResponse?: boolean;

  /** 成功消息 */
  successMsg?: (serverResponseBody: any) => string;
  /** 是否显示成功消息 */
  showSuccessMsg?: boolean | (() => boolean);
  /** 显示成功消息的函数 */
  showSuccessMsgFunction?: (msg: string) => void;

  /** 失败消息 */
  failureMsg?: (serverResponseBody: any) => string;
  /** 是否显示失败消息 */
  showFailureMsg?: boolean | (() => boolean);
  /** 显示失败消息的函数 */
  showFailureMsgFunction?: (msg: string) => void;

  /** 请求是否被mock。如url与默认配置不同，可使用此配置项。默认值随mock配置 */
  mocked?: boolean | (() => boolean);
  /** mock服务器基地址。如url与默认配置不同，可使用此配置项。默认值随mock配置 */
  mockServerBaseUrl?: string | (() => string);
  /** mock模板。如url配置与默认相反，可使用此配置项。默认值随mock配置 */
  mockTemplate?: string | object | (() => string | object);
}

/** Mock配置 */
export enum MockMode {
  /** 所有请求正常发送至服务器 */
  SERVER = "server",
  /** 所有请求被mocker */
  MOCKER = "mocker",
  /** 混合模式。此模式可实现部分请求被mock的效果，也可以实现SERVER、MOCKER的效果 */
  MIX = "mix",
}

export enum MockerStyle {
  /** 数据从服务器获取 */
  SERVER = "server",
  /** 数据从mockjs数据模板定义生成 */
  TEMPLATE = "template",
}

export interface MockConfig {
  /** mock模式 */
  mode: MockMode;
  /** mix模式请求是否被mock的默认值 */
  mixModeDefaultMocked?: boolean | (() => boolean);
  /** 非Server模式Mock服务器地址默认值 */
  defaultMockServerBaseUrl?: string | (() => string);
  /** 非Server模式Mock模版数据默认值 */
  defaultMockTemplate?: string | object | (() => string | object);
}

/** HttpClient API */
// 创建HttpClient时使用的请求配置
export type RequestConfig<D> = CreateAxiosDefaults<D> & CustomRequestConfig;

// HttpClient接口
export interface HttpClient<D> {
  axiosInstance: AxiosInstance;

  requestConfig: RequestConfig<D>;

  mockConfig: MockConfig;
}